Ugra CTF Quals 2021

Антивирус Antivipyc

Югорские разработчики создали новый облачный антивирус, с больщой точностью определяющий вредоносные приложения. Но хорошо ли протестирован сам антивирус?

Ugra 开发人员开发了一种新的云防病毒软件,可以高度准确地检测恶意程序。 但是防病毒软件本身是否经过了良好的测试?

环境给出的是一个上传的表单,尝试上传发现会有文件正常和恶意文件两种反馈。

上传一个源代码文件可发现网页响应时间较久,推测代码在被检测的过程中被执行了。尝试将表单中的 ext 参数改为 py 后随便上传一个 Python 脚本发现响应如下。

Не удалось проверить файл /tmp/uploads/1.py: плагин /app/plugins/py.py не найден

报错给出了上传文件的路径 /tmp/uploads/1.py 。此时的拓展名被拼接到了文件名后面形成了 /app/plugins/py.py,此时如果使用目录穿越,则可以执行其他的文件。构造一波目录穿越,使得其后缀为 ../../tmp/uploads/1,此时得到的文件名就是 /app/plugins/../../tmp/uploads/1.py。在上传的文件中构造如下脚本。

import os
os.system("cat /etc/passwd")

将其作为源代码文件上传即可得到如下内容。

ugra_who_checks_the_checker_b48847d6ef8eНе удалось проверить файл /tmp/uploads/1.py
ugra_who_checks_the_checker_b48847d6ef8eНе

Книга пути и достоинства daodejing

Китайская мудрость утверждает, что, чтобы не сбиться с трудного пути, необходимо употреблять достаточное количество одного витамина. Не собьётесь?

题目给出的附件中可以得到如下信息(太长了放在了 Ubuntu Pastebin)。

https://paste.ubuntu.com/p/NsTsDFrszc/

SVG Path

  • M = moveto
  • L = lineto
  • H = horizontal lineto
  • V = vertical lineto
  • C = curveto
  • S = smooth curveto
  • Q = quadratic Belzier curve
  • T = smooth quadratic Belzier curveto
  • A = elliptical Arc
  • Z = closepath

以上所有命令均允许小写字母。大写表示绝对定位,小写表示相对定位。

将 SVG 文件补充完整。

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="100%" height="100%" version="1.1"
xmlns="http://www.w3.org/2000/svg">

<path d="{ FILE CONTENT }" />

</svg>

使用浏览器打开可以得到如下内容。

ugra_grandpa_take_your_pills_or_we_will_beat_up_your_61e33e4865869f4c

ЦНИИВТ

Устроился системным администратором в Центральный НИИ вычислительной техники. На второй неделе работы обнаружил в локальной сети какой-то странный компьютер. Поспрашивал у коллег — все впервые слышат о нём, даже не знают, на каком этаже он стоит.

Искал пару дней, в итоге нашёл его в подсобке под слоем пыли — такое ощущение, что лет 30 к нему никто не прикасался. Самое удивительное — это то, что он каким-то образом подключен к интернету, и на нём даже открыт порт. При подключении просит пароль, я его раздобыл в архиве. Но вместо данных сервер шлёт какой-то мусор.

Поможете разобраться? Вдруг там что-то важное!

  • Пароль: 9bd0f869bb947165bd66ba2e7f5a5aeb

写个脚本把控制台发送的内容接收回来。

from pwn import *

connection = remote("soviet.q.2021.ugractf.ru", 17792)
connection.recvline()
connection.sendline("9bd0f869bb947165bd66ba2e7f5a5aeb")
content = connection.recvall()
file = open("out.bin", "bw")
file.write(content)
file.close()

可以得到如下内容。

ÛßßßßßÛ ß Ûß  ÜÜß ÜÜßÛÛßÜÜÛ ÜßÜ Û ÛßßßßßÛÛ ÛÛÛ Û ßßÛÜßßßÜ ß ÛÜ ßÛÛß    Üß  Û ÛÛÛ ÛÛ ßßß Û ß  ßßÜß ÜßÜÛ  ß Üß ßÛßÜßÛ Û ßßß Ûßßßßßßß Û ÛÜÛ ßÜÛÜßÜÛÜÛ ßÜß Û ß Û ßßßßßßß  Ü ÜÛßÜÜÛß ßßÛ ßß ßÛßßÜßÜÛÛ ßÜÜ  ßÜÛÜÛ ßÜÜ ßÜßßÛßÜÛÛÛßÜßßßÜÛÜÜÛßÛÛ ßÜßßÜÜß Ü Û  Ü ÛÜ ß ßßÛ ÜÜßÛßÜÛ ÜßÛÜßÜÛÛÜß ß ßÛßßÛÜßÜÜÛÜÛÛÛ ÜßÛÛß ßÛÛ ÛÜßÛßÛÛ ÛÛ  ßÛßÜÛ ÜßÜßÜÜÜÜßßÜÛßßßÛÛß   ÜÛ ßÛÛßÛßÜ ÜÜßÛßÛßßßÜÜßÛÜß ÜÜÛ  Û ßÛßÜÛÛÜÜß Ü ÛßÛ ÜßÜßÜÛÛÜÜÜÜÜÜ ÛÛßÜÛ  ßÛß ßÛÛÜßßßÛÛÛÜ ÛÛÛ ÛßÛ ßÛ  ÜÛ   ß ÜÛÛß Ü ÜÛßß ßßÜÜ ÜÛ  Û ß  Ü ßÛ ß  Ü ßÛ ÛÛ  Ü  ßÜ  ßßÜÛÜßÜÜßÜÜÜÜÜÜßß ßß  ÛÜÜßÜ  ÛÛÜÜ ßÛÜÛÜßÛÛßÜ ßÜÜÛÛ Û  ÜÜÛÛß Ü ßÛßß Üß ß ÜÛÛÜÜÜÜÛÛßÛßÜ   ß Ü ßÛÜÛßßÛß     ÜÛÜßß ßÜÜÛÛ ÜÛßßÜßÜßÜÛßßÜ   Ûß ÜßßÛÛßÛ  ÜÛßßß ÛÛÜ Û ÜÛß     ß ÛßßÜ ß ÜÛ ÜÛßÛÜ Ü  ÜÛßßÜÛßßßÛÜÛ ßÛßßßßßÛ ÜßÛßÛÜÜÜßßÛÜßÜÜÛ ßÜß  ßÜÛ ß ÛÛ Ü Û ÛÛÛ Û  Ü ÜßÜß ÜÛÛß  ÛÜ Ü ÜÜßßßßÛßßß  ÜÛÛ ßßß Û  ÜÛßÛßßÛ ßÛÛ  ßÛÛÜÜßÛ ÜßßÛÛßß ÛßÜßßßßßßß  ßßßß     ßßßß ß ßßßß  ß  ß ßßß

总共有 861 个字符,很容易求得其两个真约数为 21、41。猜测其是一个二维码,修改脚本如下。

from pwn import *

connection = remote("soviet.q.2021.ugractf.ru", 17792)
connection.recvline()
connection.sendline("9bd0f869bb947165bd66ba2e7f5a5aeb")
content = connection.recvall()
print("[+] Recieved {}".format(content))
content = content.replace(b"\xdb", b"\xe2\x96\x88") # █
content = content.replace(b"\xdf", b"\xe2\x96\x80") # ▀
content = content.replace(b"\xdc", b"\xe2\x96\x84") # ▄
content = content.decode()
print("[*] Content parsed as {}".format(content))
for x in range(21):
    print(content[x * 41 : (x + 1) * 41])

可以得到如下结果。

█▀▀▀▀▀█ ▀ █▀  ▄▄▀ ▄▄▀█▄▀█ █ ▄▀▄ █ █▀▀▀▀▀█
█ ███ █ ▀▀█▄▀▀▀▄ ▀ █▄ ▀█▄▀    ▄▀  █ ███ █
█ ▀▀▀ █ ▀  ▀▀▄▀ ▄▀▄█▀█▀ ▄▀ ▀█▀▄▀█ █ ▀▀▀ █
▀▀▀▀▀▀▀ █ █▄█ ▀▄█▄▀▄█▄█ ▀▄▀ █ ▀ █ ▀▀▀▀▀▀▀
  ▄ ▄█▀▄▄█▀ ▀▀█ ▀▀ ▀█▀▀▄▀▄██ ▀▄▄  ▀▄█▄█ ▀
▄▄ ▀▄▀▀█▀▄███▀▄▀▀█▄█▄▄█▀██ ▀▄▀▀▄▄▀ ▄ █  ▄
 █▄ ▀ ▀▀█ ▄▄▀█▀▄█ ▄▀█▄▀▄█▀▄▀ ▀ ▀█▀▀█▄▀▄▄█
▄███ ▄▀█▀▀ ▀██ █▄▀█▀█▀▀█▀  ▀█▀▄█ ▄▀▄▀▄▄▄▄
▀▀▄█▀▀▀██▀   ▄█ ▀██▀ ▀▄ ▄▄▀█▀█▀█▀▄▄██▄▀ ▄
▄█▀ █ ▀█▀ ██▄▄▀ ▄ █▀█ ▄█▄ ▄██▄▄█▄▄▄ ███▄█
  ▀▀▀ ▀▀█▄▀▀▀███▄ ███ █▄█ ▀█  ▄█  ▄▀▄▄█▀ 
 ▄ ▄█▀  ▀▀▄▄ ▄█  █ ▀▀ ▄ ▀█ █    ▀█ █▄  ▄ 
 ▀▄  ▀▀▄█▄ ▄▄▀▄▄▄▄▄▄▀▀ ▀█  █▄▄ ▄▄ ██▄▄ ▀█
▄█▄▀██▀▄ ▀▄▄██ █  ▄▄█▀▀ ▀ ▀█▀▀ ▄▀ ▀ ▄██▄▄
▄███▀▀▀▄   ▀▀▄▄██▄██▀█▀ ▄   ▄█▄▀▀ ▀▄▄██ ▄
█▀▀▄▀▄▀▄█▀▀▄   █▀ ▄▀▀██▀█  ▄█▀▀▀ ██▄ █ ▄█
▀     ▀ █▀▀▄ ▀ ▄█ ▄█ █▄ █  ▄█▀▀▄█▀▀▀█▄█ ▀
█▀▀▀▀▀█ ▄▀█▀█▄▄▄▀▀█▄▀▄▄█ ▀▄▀  ▀▄█ ▀ ██ ▄ 
█ ███ █  ▄ ▄▀▄▀ ▄██▀  █▄ ▄ ▄▄▀▀▀▀█▀▀▀  ▄█
█ ▀▀▀ █  ▄█▀█▀▀█▀▀██ ▄▀██▄▄▀█ ▄▀▀██▀▀ █▀▄
▀▀▀▀▀▀▀  ▀▀▀▀     ▀▀▀▀ ▀ ▀▀▀▀  ▀  ▀ ▀▀▀

Word 稍微排一下,可以得到如下图片。

Parse QR Code 即可以得到 flag。

ugra_soviet_technologies_are_eternal_369863efd250

Новейшая разработка developers

Это исходный код программного обеспечения, разработанного очень крутыми разработчиками. Но иногда и они допускают ошибки. Ну так, по невнимательности.

这是非常出色的开发人员开发的软件的源代码。 但是有时候他们也会犯错误。 好吧,无意间。

考点: https://git-scm.com/docs/git-fsck

使用 git fsck 可以 dangling 出一个 commit。此时查看相关 commit 可得到 flag。

commit 7f3b10fd4fdf9a74cab201e4f3f8ece5cf9e4833
Author: Validian <validian@validian.name>
Date:   Wed Dec 11 06:00:30 2019 +0845

    added info.txt.

diff --git a/info.txt b/info.txt
new file mode 100644
index 0000000..d3849f0 /dev/null
+++ b/info.txt
@@ -0,0 +1,7 @@
+If you are reading this, I am definitely dead by now.
+
+I also know that by reaching this file, you have demonstrated
+the best of your ability and courage. Here is the key to my
+lifetime secret: ugra_the_yellow_purse_6f557934d3d1f541
+
+You will understand what to do next. Good luck!
ugra_the_yellow_purse_6f557934d3d1f541

results matching ""

    No results matching ""